﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using BusinessLayer.Interfaces;
using BusinessLayer.Implementacion;
using EntityLayer;

namespace proyGestionVisitas.Gestion
{
    public partial class wfrmInformacionClientesVisitar : System.Web.UI.Page
    {
        private IFacadeInformacionClientesVisitar FacadeInformacionClientesVisitar;
        private IEnumerable<Object> lista = null;
        private String msg = String.Empty;

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (Session["usu"] == null) { Response.Redirect("~/Account/Login.aspx"); return; }
                ListarServicios();
                if (!IsPostBack)
                {
                    if (Session["ok"] != null)
                    {
                        Session["ok"] = null;
                        MostrarComentario(Session["msg"].ToString());
                    }
                    Session["buscar"] = null;
                    Buscar();
                    
                }
            }
            catch (Exception ex)
            {
                MostrarComentario(ex, "Page_Load");
            }
        }

        private void MostrarComentario(String msg, String titulo = "Mensaje")
        {
            CargarComentario(msg, titulo);
        }

        private void MostrarComentario(Exception ex, String titulo)
        {
            if (ex != null) { msg = (ex.InnerException != null) ? ex.InnerException.Message : ex.Message; }
            CargarComentario(msg, titulo);
        }

        private void CargarComentario(string msg, String titulo)
        {
            lblmenOK.Text = msg;
            pcMensaje.HeaderText = titulo;
            pcMensaje.ShowOnPageLoad = true;
        }

        private void ListarServicios()
        {
            try
            {
                cboServicios.Items.Clear();
                lista = new List<Object>();
                FacadeInformacionClientesVisitar = new FacadeInformacionClientesVisitar();
                lista = FacadeInformacionClientesVisitar.ListarServicios();

                cboServicios.DataSource = lista;
                cboServicios.ValueField = "co_servicio";
                cboServicios.TextField = "no_servicio";
                cboServicios.DataBind();
            }
            catch (Exception ex)
            {
                MostrarComentario(ex, "ListarServicios");
            }
        }

        private void ListarProductoxServicio()
        {
            try
            {
                cboProductos.Items.Clear();
                if (cboServicios.SelectedItem == null) { MostrarComentario("Debe seleccionar un Servicio."); return; }
                int co_servicio = Convert.ToInt32(cboServicios.SelectedItem.Value.ToString());
                lista = new List<Object>();
                FacadeInformacionClientesVisitar = new FacadeInformacionClientesVisitar();
                lista = FacadeInformacionClientesVisitar.ListarProductoxServicio(co_servicio);

                cboProductos.DataSource = lista;
                cboProductos.ValueField = "co_producto";
                cboProductos.TextField = "no_producto";
                cboProductos.DataBind();
                if (cboProductos.Items.Count > 0) { cboProductos.SelectedIndex = 0; }
            }
            catch (Exception ex)
            {
                MostrarComentario(ex, "ListarProductoxServicio");
            }
        }

        protected void cboServicios_ValueChanged(object sender, EventArgs e)
        {
            ListarProductoxServicio();
        }

        protected void btnBuscar_Click(object sender, EventArgs e)
        {
            if (!ValidarCampos()) { return; }
            Buscar();
        }

        private Boolean ValidarCampos()
        {
            Boolean ok = true;
            msg = String.Empty;
            double num;
            try
            {
                if (ok && (txtPresupuestoIni.Text.Trim() != String.Empty || txtPresupuestoFin.Text.Trim() != String.Empty))
                {
                    if (!Double.TryParse(txtPresupuestoIni.Text.Trim(), out num))
                    {
                        ok = false;
                        msg = "El Monto Inicial del Presupuesto debe ser numerico.";
                    }
                    else if (!Double.TryParse(txtPresupuestoFin.Text.Trim(), out num))
                    {
                        ok = false;
                        msg = "El Monto Final del Presupuesto debe ser numerico.";
                    }
                }

                if (ok && (txtEsfuerzoIni.Text.Trim() != String.Empty || txtHastaFin.Text.Trim() != String.Empty))
                {
                    if (!Double.TryParse(txtEsfuerzoIni.Text.Trim(), out num))
                    {
                        ok = false;
                        msg = "La Cantidad Inicial del Esfuerzo debe ser numerico.";
                    }
                    else if (!Double.TryParse(txtHastaFin.Text.Trim(), out num))
                    {
                        ok = false;
                        msg = "La Cantidad Final del Esfuerzo debe ser numerico.";
                    }
                }
            }
            catch (Exception ex)
            {
                ok = false;
                msg = String.Empty;
                MostrarComentario(ex, "ValidarCampos");
            }
            if (!ok && msg != String.Empty) { MostrarComentario(msg); }
            return ok;
        }

        private void Buscar()
        {
            try
            {
                int? co_servicio, co_producto, co_tipo_pres, vacio_int = null;
                Decimal? pres_ini, pres_fin, esf_ini, esf_fin, co_tipo_esf, vacio_decimal = null;

                co_servicio = (cboServicios.SelectedItem != null) ? Convert.ToInt32(cboServicios.SelectedItem.Value.ToString()) : vacio_int;
                co_producto = (cboProductos.SelectedItem != null) ? Convert.ToInt32(cboProductos.SelectedItem.Value.ToString()) : vacio_int;
                pres_ini = (txtPresupuestoIni.Text.Trim() != String.Empty) ? Convert.ToDecimal(txtPresupuestoIni.Text.Trim()) : vacio_decimal;
                pres_fin = (txtPresupuestoFin.Text.Trim() != String.Empty) ? Convert.ToDecimal(txtPresupuestoFin.Text.Trim()) : vacio_decimal;
                co_tipo_pres = (cboTipoPresupuesto.SelectedItem != null) ? Convert.ToInt32(cboTipoPresupuesto.SelectedItem.Value.ToString()) : vacio_int;
                esf_ini = (txtEsfuerzoIni.Text.Trim() != String.Empty) ? Convert.ToDecimal(txtEsfuerzoIni.Text.Trim()) : vacio_decimal;
                esf_fin = (txtHastaFin.Text.Trim() != String.Empty) ? Convert.ToDecimal(txtHastaFin.Text.Trim()) : vacio_decimal;
                co_tipo_esf = (cboTipoEsfuerzo.SelectedItem != null) ? Convert.ToInt32(cboTipoEsfuerzo.SelectedItem.Value.ToString()) : vacio_int;

                Session["buscar"] = "1";
                Session["co_servicio"] = co_servicio;
                Session["co_producto"] = co_producto;
                Session["pres_ini"] = pres_ini;
                Session["pres_fin"] = pres_fin;
                Session["co_tipo_pres"] = co_tipo_pres;
                Session["esf_ini"] = esf_ini;
                Session["esf_fin"] = esf_fin;
                Session["co_tipo_esf"] = co_tipo_esf;

                GenerarListaOportunidades();
            }
            catch (Exception ex)
            {
                MostrarComentario(ex, "Buscar");
            }
        }

        private void GenerarListaOportunidades()
        {
            try
            {
                dgvClientesAVisitar.DataSource = null;
                dgvClientesAVisitar.DataBind();

                String co_buscar, no_sector;
                int? co_servicio, co_producto, co_tipo_pres, co_tipo_esf, co_usuario, vacio_int = null;
                Decimal? pres_ini, pres_fin, esf_ini, esf_fin, vacio_decimal = null;

                co_buscar = (Session["buscar"] != null) ? Session["buscar"].ToString() : String.Empty;
                if (co_buscar == String.Empty) { return; }
                co_servicio = (Session["co_servicio"] != null) ? Convert.ToInt32(Session["co_servicio"]) : vacio_int;
                co_producto = (Session["co_producto"] != null) ? Convert.ToInt32(Session["co_producto"]) : vacio_int;
                pres_ini = (Session["pres_ini"] != null) ? Convert.ToDecimal(Session["pres_ini"]) : vacio_decimal;
                pres_fin = (Session["pres_fin"] != null && pres_ini != vacio_decimal) ? Convert.ToDecimal(Session["pres_fin"]) : vacio_decimal;
                co_tipo_pres = (Session["co_tipo_pres"] != null && pres_ini != vacio_int) ? Convert.ToInt32(Session["co_tipo_pres"]) : vacio_int;
                esf_ini = (Session["esf_ini"] != null) ? Convert.ToDecimal(Session["esf_ini"]) : vacio_decimal;
                esf_fin = (Session["esf_fin"] != null && esf_ini != vacio_decimal) ? Convert.ToDecimal(Session["esf_fin"]) : vacio_decimal;
                co_tipo_esf = (Session["co_tipo_esf"] != null && esf_ini != vacio_int) ? Convert.ToInt32(Session["co_tipo_esf"]) : vacio_int;
                no_sector = Session["no_sector"].ToString();
                co_usuario = Convert.ToInt32(Session["co_usu"].ToString());

                lista = new List<Object>();
                FacadeInformacionClientesVisitar = new FacadeInformacionClientesVisitar();
                lista = FacadeInformacionClientesVisitar.GenerarListaOportunidades(co_servicio, co_producto, co_tipo_pres, pres_ini, pres_fin, esf_ini, esf_fin, co_tipo_esf, no_sector, co_usuario);

                if (lista == null || lista.Count() == 0) { MostrarComentario("No existen datos para la consulta realizada."); return; }

                dgvClientesAVisitar.DataSource = lista;
                dgvClientesAVisitar.DataBind();

            }
            catch (Exception ex)
            {
                MostrarComentario(ex, "GenerarListaOportunidades");
            }
        }

        protected void dgvClientesAVisitar_AfterPerformCallback(object sender, DevExpress.Web.ASPxGridView.ASPxGridViewAfterPerformCallbackEventArgs e)
        {
            GenerarListaOportunidades();
        }

        protected void dgvClientesAVisitar_PageIndexChanged(object sender, EventArgs e)
        {
            GenerarListaOportunidades();
        }
    }
}